package algo3c3g3.model;

import algo3c3g3.model.material.*;
import org.jdom.Element;

import algo3c3g3.model.persistence.Persistable;

/**
 * Representa la estructura de la que esta formada un mapa.
 * Define su interaccion con la unidades a traves del material del que esta hecho.
 */
public class Block implements Persistable
{   
    private Coord position;
    
    /**
     * Material del que esta hecho el bloque.
     */
    private Material material;
    
    /**
     * Crea un bloque de un material especifico.
     * @param x Coordenada x
     * @param y Coordenada y
     * @param material Debe ser un objeto nuevo del tipo Material.
     */
    public Block(int x, int y, Material material)
    {
        position = new Coord(x, y);
        this.material = material;
    }
    
    public Block(Element e)
    {
    	this.load(e);
    }
    
    public Material getMaterial()
    {
        return material;
    }
    
    /**
     * Indica si el material del bloque es solido (detiene el paso de las unidades).
     * @return true si es un material solido.
     */
    public boolean isSolid()
    {
        return material.isSolid();
    }
    
    public void affectUnitX(Unit unit)
    {
        material.affectUnitX(unit);
    }
    
    public void affectUnitY(Unit unit)
    {
        material.affectUnitY(unit);
    }
    
    public boolean isBreakable()
    {
        return material.isBreakable();
    }
    
    public Coord getCoord()
    {
        return position;
    }

    public void setCoord(Coord c)
    {
        position = c;
    }
    
    public void load(Element e)
    {
    	position = new Coord(e);
        material = MaterialFactory.getInstance(e.getChildText("material"));
    }

    /**
     * es el encargado de serializar al block.
     * @return el block serializado dentro de un objeto Element
     */
    public Element save()
    {
        Element block = new Element("Block");
        block.addContent(this.getCoord().save());
        block.addContent(new Element("material").setText(material.toString()));
        return block;
    }
}
